{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tutorial - Basic\n",
    "---\n",
    "Basic skills with _phalanx_."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## What _phalanx_ does\n",
    "\n",
    "_phalanx_ simulates an quantum annealing process by generating a so-called Gibbs distribution.  This distribution reflects an invariant end of some qubits evolving under some certain topological structure.  \n",
    "\n",
    "Users can define the inner structure of these qubits by setting the connection relationship.  If it's done, _phalanx_ generates a Hamiltonian for it, and calculates its eigenvalues and eigenstates.  \n",
    "\n",
    "In _phalanx_, an annealer with $N$ qubits has a Hamiltonian like  \n",
    "\n",
    "$$ H = \\sum_i^Nh_iZ_i + \\sum_{i,j}^N J_{ij}Z_iZ_j $$\n",
    "\n",
    "Here $Z$ is the Pauli matrix,  \n",
    "\n",
    "\\begin{bmatrix}\n",
    "1 & 0\\\\\n",
    "0 &-1\n",
    "\\end{bmatrix}\n",
    "\n",
    "$h$ and $J$ have similar meanings as in conventional Ising model, and are combined together as one upper triangular matrix which we call it the connection of the annealer.\n",
    "\n",
    "An user can measure the final Gibbs distribution.  In this procedure, _phalanx_ will pick up an eigenstate in this distribution according to \n",
    "\n",
    "\\begin{align*} \\frac{e^{-\\beta E}}{{\\rm tr}(e^{-\\beta H})} \\end{align*}\n",
    "\n",
    "$E$ is the eigenvalue for this eigenstate, $\\beta$ is the inverse temperature.  Then makes it collapses to an observation basis state and return it.\n",
    "\n",
    "By enough measurements, users can infer the Gibbs distribution, just like for a real annealing process."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create and set an annealer object\n",
    "\n",
    "To start the simulation, we need define an annealer object at first.  An annealer is a collection of several qubits with an environment parameter $\\beta$.  $\\beta$ is usually named as inverse temperature, because in statistical mechanics $\\beta = 1 / (k_BT)$.  So a lager $\\beta$ means lower temperature, gives a narrow distribution."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from phalanx import Annealer\n",
    "\n",
    "beta = 4.0\n",
    "num_qubits = 3\n",
    "anl = Annealer(beta, num_qubits)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The connection relationship is defined by the connection matrix, which is an upper triangular matrix.  The diagonal elements are $h$ in the Hamiltonian and the off-diagonal elements are $J$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Set connection of the qubits.\n",
    "cnt = [\n",
    "    [1,2,3],\n",
    "    [0,1,2],\n",
    "    [0,0,1]]\n",
    "anl.set_connection(cnt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Check the connection\n",
    "\n",
    "You can directly check the connection matrix or by an undirected graph.  The number on vertex denotes the qubit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 2., 3.],\n",
       "       [0., 1., 2.],\n",
       "       [0., 0., 1.]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "anl.connection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "anl.draw_topology()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The Hilbert space\n",
    "\n",
    "After setting the connection, a Hamiltonian is calculated automatically from it, also the eigenvalues and the eigenstates.  You can directly check them.  They are all numpy arrays."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[10.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],\n",
       "       [ 0., -2.,  0.,  0.,  0.,  0.,  0.,  0.],\n",
       "       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],\n",
       "       [ 0.,  0.,  0., -4.,  0.,  0.,  0.,  0.],\n",
       "       [ 0.,  0.,  0.,  0., -2.,  0.,  0.,  0.],\n",
       "       [ 0.,  0.,  0.,  0.,  0., -2.,  0.,  0.],\n",
       "       [ 0.,  0.,  0.,  0.,  0.,  0., -4.,  0.],\n",
       "       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  4.]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "anl.hamiltonian"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([10., -2.,  0., -4., -2., -2., -4.,  4.])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "anl.eigenvalue"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 1., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 1., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 1., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 1., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 1., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 1., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 1.]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "anl.eigenstate"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Qubit notation\n",
    "\n",
    "Since Hamiltonian in _phalanx_ is of Ising type, we denote a qubit's state by $1$ for up, $-1$ for down.\n",
    "\n",
    "\\begin{align*}\n",
    "|1\\rangle = \\begin{bmatrix} 1 \\\\ 0 \\end{bmatrix},\n",
    "\\hspace{0.6cm}\n",
    "|-1\\rangle = \\begin{bmatrix} 0 \\\\ 1 \\end{bmatrix}.\n",
    "\\end{align*}\n",
    "\n",
    "For a system has more than one qubit, a state like $|1,1,-1\\rangle$ means there are three qubits in 'up','up','down' state, respectively. And we take the leftmost one in the notation as the first one.\n",
    "\n",
    "\\begin{align*}\n",
    "|1,-1\\rangle = |1\\rangle \\otimes |-1\\rangle = \\begin{bmatrix} 1 \\\\ 0 \\end{bmatrix} \\otimes \\begin{bmatrix} 0 \\\\ 1 \\end{bmatrix} = \n",
    "\\begin{bmatrix} 0 \\\\ 1 \\\\ 0 \\\\ 0 \\end{bmatrix}\n",
    "\\end{align*}\n",
    "\n",
    "Sometimes, for some problems, users need to transfer the notation from $\\{1,-1\\}$ to $\\{1, 0\\}$ according to \n",
    "\n",
    "$$ q = \\frac{s+1}{2}. $$\n",
    "\n",
    "Here $q \\in \\{1,0\\}$, $s \\in \\{1, -1\\}$.  Then a state like $|1,-1\\rangle$ becomes to $|1, 0\\rangle$.  In this notation, $1$ means 'up', $0$ means 'down'."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Measurement\n",
    "\n",
    "In our context, information of a simulated annealing end is acquired immediately after the connection is set. A measurement on the annealer will return a qubit configuration according to the former information. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, -1, -1]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "anl.measure()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We use **1** to denote qubit up state, **-1** for down."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can repeat the measurement to acess more information about the Gibbs distribution."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, -1, -1]\n",
      "[1, -1, -1]\n",
      "[-1, -1, 1]\n",
      "[1, -1, -1]\n",
      "[1, -1, -1]\n",
      "[-1, -1, 1]\n"
     ]
    }
   ],
   "source": [
    "for i in range(6):\n",
    "    print(anl.measure())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Also there is a graph view for the last outcome."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "anl.draw_result()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We use deep color for **1** and light color for **-1**."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
